<?php
/**
 * Created by clz.
 * User: clz
 * Date: 2018/8/6
 * Time: 18:55
 */

/*
 * 简单（静态）工厂模式
 *
 * 对象的生成 封装类的实例化 过程
 */
abstract class product
{
    abstract public function get();
}
class product1 extends product
{
    public function get(){
        echo '我是苹果手机';
    }
}
class product2 extends product
{
    public function get(){
        echo '我是小米手机';
    }
}
class factory
{
    public static function getProduct($type)
    {
        switch($type){
            case 1 :
                return new product1();
                break;
            case 2 :
                return new product2();
                break;
        }
    }
    //多方法-多车间简单工厂
    public static function getProduct1()
    {
        return new product1();
    }
    public static function getProduct2()
    {
        return new product2();
    }
    //反射
    public static function getRefProduct($productName)
    {
        return new $productName();
    }
}
//工厂方法 模式 === 多工厂，把简单工厂分开为两层：抽象的和具体的。

//抽象工厂 模式 === 多工厂，多车间：在工厂方法的基础上，每个工厂类多个不同产品的创建方法。好处是每个工厂可以创建多个产品

/*
 * 2 单例模式
 * 只需要有一个对象的类
 */
class singleton
{
    private static $instance;
    private function __construct(){}
    public static function getInstance()
    {
        if(self::$instance == null){
            self::$instance = new singleton();
        }
        return self::$instance;
    }
}


$var = factory::getProduct1()->get();
//var_export($var);